	
import java.io.IOException;
import java.util.Vector;

/**
 * 
 * @author Guilherme Mauro Germoglio - guiga@dsc.ufcg.edu.br
 */
class P10062 {


		private static String newLine = System.getProperty("line.separator");

		static String readLn () {
		        StringBuffer buffer = new StringBuffer();
		        int car = -1;

	        	try {
				car = System.in.read();
				while ((car > 0) && (car != newLine.charAt(0))) {
					buffer.append((char)car);
					car = System.in.read();
				}
				if (car == newLine.charAt(0))
					System.in.skip(newLine.length() - 1);
			} catch (IOException e) {
				return (null);
			}

			if ((car < 0) && (buffer.length() == 0))
				return (null);  /* eof */
			return (buffer.toString());
		}


		
		public static void main(String[] args) {
			
						String line = readLn();
			while (line != null) {
				int[] ascii = pegaAscii(line);
				int[] frequencias = calculaFrequencias(ascii, line);
				ordena(frequencias, ascii);
				imprime(ascii, frequencias);
				line = readLn();
				
				if (line != null) System.out.println();
			}
		}


		private static void imprime(int[] ascii, int[] frequencias) {
			for (int k = 0; k < ascii.length; k++) {
				System.out.println(ascii[k] + " " + frequencias[k]);
			}
			
		}

		private static void quickSort(int[] ocorrencias, int[] ascii, int i, int j) {
			if (i < j) {
				int pivot = particiona(ocorrencias, ascii, i, j);
				quickSort(ocorrencias, ascii, i, pivot-1);
				quickSort(ocorrencias, ascii, pivot+1, j);
			}
		}

		private static int particiona(int[] ocorrencias, int[] ascii, int i, int j) {
			int pivot = j;
			for (int k = pivot-1; k >= 0; k--) {
				if (ocorrencias[pivot] < ocorrencias[k] || ( ocorrencias[pivot] == ocorrencias[k] && ascii[pivot] > ascii[k] )) {
					troca(k, pivot-1, ocorrencias, ascii);
					troca(pivot-1, pivot, ocorrencias, ascii);
					pivot = pivot-1;
				}
			}
			return pivot;
		}
		private static void troca(int k, int i, int[] ocorrencias, int[] ascii) {
			int auxInt = ocorrencias[k];
			ocorrencias[k] = ocorrencias[i];
			ocorrencias[i] = auxInt;
			int auxAscii = ascii[k];
			ascii[k] = ascii[i];
			ascii[i] = auxAscii;
		}


		private static void ordena(int[] frequencias, int[] ascii) {
			quickSort(frequencias, ascii, 0, frequencias.length - 1);
			
		}



		private static int[] calculaFrequencias(int[] ascii, String line) {
			int[] frequencias = new int[ascii.length];
			for (int k = 0; k < line.length(); k++) {
				for (int j = 0; j < ascii.length; j++) {
					if (ascii[j] == line.charAt(k)) {
						frequencias [j]++;
					}
				}
			}
			
			return frequencias;
		}



		private static int[] pegaAscii(String line) {
			Vector conjunto = new Vector();
			for (int k = 0; k < line.length(); k++) {
				Integer c = new Integer((int)line.charAt(k));
				if (!conjunto.contains(c)) {
					conjunto.addElement(c);
				}
			}
			int[] retorno = new int[conjunto.size()];
			for (int k = 0; k < conjunto.size(); k++) {
				retorno[k] = ((Integer)conjunto.elementAt(k)).intValue();
			}
			return retorno;
		}
 
}

